Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB.NET] Richiamo funzione da dll esterna
Forum - C# / VB.NET - [VB.NET] Richiamo funzione da dll esterna

Avatar
mattia86 (Normal User)
Newbie


Messaggi: 1
Iscritto: 10/05/2010

Segnala al moderatore
Postato alle 9:15
Lunedì, 10/05/2010
Buongiorno a tutti e complimenti per il forum!

Purtroppo ho un grosso problema che mi ha portato alla disperazione dopo 3 giorni di tentativi veniamo al dunque.

Ho una dll esterna che mi permette, tramite una funzione, di estrarre la temperatura della cpu ( e molti altri dati, per ora considero questo per semplicità). Il problema è che non riesco a dichiararla e a passarci i valori giusti.

Nella specifica della dll c'è scritto questo :

Codice sorgente - presumibilmente VB.NET

  1. BOOL SusiHWMGetTemperature(WORD tempType, float *retval, WORD *typeSupport = NULL);
  2.  
  3. Parameters
  4.  
  5. tempType
  6.  
  7. [in]Specifies a temperature sensor to get value from. It can be one of the flags
  8.  
  9. TCPU (1) – CPU temperature
  10.  
  11. TSYS (2) – System / ambient temperature
  12.  
  13. retval
  14.  
  15. [out]Point to a variable in which this function returns the temperature in Celsius.
  16.  
  17. Typesupport
  18.  
  19. [out]
  20.  
  21. If the value is specified as a pointer (non-NULL) to a variable, it will return the types of available sensors in flags bitwise-ORed
  22.  
  23. Return Value
  24.  
  25. TRUE (1) indicates success; FALSE (0) indicates failure



In un progetto di esempio sviluppato in C# (di cui io non capisco una cippa, o quasi), la funzione è utilizzata in questo modo :

Codice sorgente - presumibilmente C#

  1. [DllImport("Susi.dll")]
  2.     public unsafe static extern bool SusiHWMGetTemperature(UInt16 tempType, float* retval, UInt16* typeSupport);
  3.  
  4. float[] temp = new float[3];
  5.  
  6. fixed (float* pfT = temp)
  7.         for (ushort m = 0, j = 1; j < (1 << 3); j <<= 1)
  8.         {
  9.           if (0 != (j & u16TempSupport))
  10.           {
  11.             if (!SusiHWMGetTemperature(j, pfT + m, null))
  12.             {
  13.               MessageBox.Show("SusiHWMGetTemperature failed! " + "ErrorCode = " + SusiDllGetLastError().ToString());
  14.               return;
  15.             }
  16.           }
  17.  
  18.           m++;
  19.         }



In questo modo ovviamente, inserendo temp[1] in una textbox, ottengo la temperatura del sistema.... io in vb ho provato a fare così : (fa anche rima)

Codice sorgente - presumibilmente VB.NET

  1. 'Importo la funzione dalla dll
  2. <DllImport("Susi.dll")> _
  3.   Public Shared Function SusiHWMGetTemperature(ByVal tempType As UInt16, ByRef retval As Single, ByRef typeSupport As UInt16) As Boolean
  4.   End Function
  5.  
  6. Dim Temperatura As Single = 0
  7.  
  8. 'richiamo la funzione per l'estrazione della temperatura e verifico che il valore restituito sia true (infatti lo è)
  9. Trace.WriteLine(PCM3362.SusiHWMGetTemperature(1, Temperatura, Nothing).ToString)
  10.  
  11. 'aggiorno il valore della textbox
  12. Me.TextBoxTemperaturaCPU.Text = Temperatura.ToString



A questo punto la textbox e la variabile conterranno sempre il valore 0! non capisco proprio il perchè! Ho cercato di prendere e convertire semplicemente tutto ciò che è stato sviluppato in C# in VB!

Help please!  :hail:

Saluti


PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 10:16
Lunedì, 10/05/2010
In teoria, è giusto... Se proprio non funziona, prova a passare al posto di single un puntatore (IntPtr in vb) ad un'area di memoria allocata con Marshal.AllocHGlobal. Poi ne leggi il valore.
Anche se mi sembra strano: con il byref dovrebbe funzionare correttamente.

PM Quote